﻿Imports System.IO
Public Class GestionarProductos
    Public Event ErrorProducto(ByVal sender As Object, ByVal e As EventArgs)
    'ruta del del directoryPath de nuestra aplicacion donde se encuentran los archivos
    Private ruta As String = My.Application.Info.DirectoryPath
    'Lista de productos
    Private _Productos As New List(Of Producto)
    ''' <summary>
    ''' Productos que tenemos en nuestro sistema
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Productos As ObjectModel.ReadOnlyCollection(Of Producto)
        Get
            Return _Productos.AsReadOnly
        End Get
    End Property
    ''' <summary>
    ''' Constructor que extrae los productos del archivo Productos.txt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        Try
            If Not File.Exists(ruta & "\Productos.txt") Then Exit Sub
            Dim fichero As StreamReader = Nothing
            Try
                fichero = New StreamReader(ruta & "\Productos.txt")
                Do Until fichero.EndOfStream
                    Dim linea As String = fichero.ReadLine
                    Dim datos() As String = linea.Split("*")
                    If datos(datos.Length - 1) = "0" Then _Productos.Add(New Comida(datos(0), Decimal.Parse(datos(1)), datos(2), datos(3)))
                    If datos(datos.Length - 1) = "1" Then _Productos.Add(New Complementos(datos(0), Decimal.Parse(datos(1)), datos(2), datos(3)))
                    If datos(datos.Length - 1) = "2" Then _Productos.Add(New Bebida(datos(0), Decimal.Parse(datos(1)), datos(2), datos(3)))
                Loop
            Catch ex As Exception
            Finally
                fichero.Close()
            End Try
        Catch ex As Exception

        End Try
    End Sub
    ''' <summary>
    ''' función para grabar las fotos en la ruta de nuestra aplicacion
    ''' </summary>
    ''' <param name="prod">Nombre del producto</param>
    ''' <remarks></remarks>
    Private Function copiarFoto(ByVal prod As Producto) As String

        If Not Directory.Exists(ruta & "\fotos\") Then Directory.CreateDirectory(ruta & "\fotos")
        Dim carpetas() As String = prod.Foto.Split("\")
        Dim ficheroFoto As String = carpetas(carpetas.Length - 1)
        Dim nuevaRutaFoto As String = ruta & "\fotos\" & ficheroFoto
        If File.Exists(nuevaRutaFoto) Then Return "Esa foto ya existe"
        File.Copy(prod.Foto, nuevaRutaFoto)
        prod.Foto = nuevaRutaFoto

        Return ""


    End Function
    ''' <summary>
    ''' Añade los productos a la Lista
    ''' </summary>
    ''' <param name="prod">Nombre del producto</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function AñadirLista(ByVal prod As Producto) As String
        If prod Is Nothing OrElse prod.Nombre Is Nothing OrElse prod.Precio = 0 OrElse prod.Foto Is Nothing OrElse prod.Descripcion Is Nothing Then
            RaiseEvent ErrorProducto(prod, New EventArgs)
            Return ""
        End If

        If _Productos.Contains(prod) AndAlso _Productos.Count > 0 Then Return "Ya existe el/la" & prod.GetType.Name & " de nombre " & prod.Nombre
        If prod.Precio < 0 Then
            Return "El producto " & prod.Nombre & " no tiene un precio adecuado"
        End If
        If Not prod.Foto.Contains(ruta & "\fotos") Then
            Dim men As String = copiarFoto(prod)
            If men <> "" Then
                Return men
            End If
        End If
        _Productos.Add(prod)
        Return ""
    End Function
    ''' <summary>
    ''' Grabamos la lista en el archivo Productos.txt
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function Grabar() As String
        Dim fichero As StreamWriter = Nothing
        Try
            fichero = New StreamWriter(ruta & "\Productos.txt")
            For Each prod In _Productos
                If prod.GetType = GetType(Comida) Then fichero.WriteLine(prod.Nombre & "*" & prod.Precio & "*" & prod.Descripcion & "*" & prod.Foto & "*0")
                If prod.GetType = GetType(Complementos) Then fichero.WriteLine(prod.Nombre & "*" & prod.Precio & "*" & prod.Descripcion & "*" & prod.Foto & "*1")
                If prod.GetType = GetType(Bebida) Then fichero.WriteLine(prod.Nombre & "*" & prod.Precio & "*" & prod.Descripcion & "*" & prod.Foto & "*2")
            Next
            fichero.Close()
        Catch ex As Exception
            fichero.Close()
            Return ex.Message
        End Try
        Return ""
    End Function
    ''' <summary>
    ''' Nos dan el Producto que debemos agregar a la Lista
    ''' </summary>
    ''' <param name="prod">Nombre del nuevo producto</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Añadir(ByVal prod As Producto) As String
        Dim men As String = AñadirLista(prod)
        If men = "" Then Grabar()
        Return men
    End Function
    ''' <summary>
    ''' Borrar Lista Productos
    ''' </summary>
    ''' <param name="nombre">Nombre producto a borrar</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function BorrarLista(ByVal nombre As String) As String
        Dim prod As New Producto(nombre, 0, "", "")
        If Not _Productos.Contains(prod) Then Return "No existe el producto " & nombre
        prod = _Productos(_Productos.IndexOf(prod))
        'For Each pr In Productos
        '    If pr.Nombre = prod.Nombre Then
        '        File.Delete(pr.Foto)
        '        _Productos.Remove(pr)
        '    End If
        'Next
        File.Delete(prod.Foto)
        _Productos.Remove(prod)
        Return ""
    End Function
    ''' <summary>
    ''' Borrar un Producto
    ''' </summary>
    ''' <param name="nombre">Nombre producto</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Borrar(ByVal nombre As String) As String
        Dim men As String = BorrarLista(nombre)
        If men = "" Then Grabar()
        Return men
    End Function
    ''' <summary>
    ''' Modificar lista Productos
    ''' </summary>
    ''' <param name="productoNuevo">Nombre producto modificado</param>
    ''' <param name="nombreBorrar">Nombre producto antiguo</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function ModificarEnLista(ByVal productoNuevo As Producto, ByVal nombreBorrar As String) As String
        Dim productoViejo As New Producto(nombreBorrar, 0, "", "")
        If productoNuevo Is Nothing OrElse productoViejo Is Nothing Then Return "No se puede agregar"
        If Not _Productos.Contains(productoViejo) Then Return "No existe el/la" & productoViejo.GetType.Name & " de nombre " & productoViejo.Nombre
        productoViejo = _Productos(_Productos.IndexOf(productoViejo))
        productoViejo.Nombre = productoNuevo.Nombre
        productoViejo.Precio = productoNuevo.Precio
        productoViejo.Descripcion = productoNuevo.Descripcion
        If Not productoNuevo.Foto.Equals(productoViejo.Foto) Then
            File.Delete(productoViejo.Foto)
            copiarFoto(productoNuevo)
            productoViejo.Foto = productoNuevo.Foto
        End If
        Return ""
    End Function
    ''' <summary>
    ''' Modificar un Producto
    ''' </summary>
    ''' <param name="prodModificado">Nombre producto ya modificado</param>
    ''' <param name="NombreProdAntiguo">Nombre del producto a modificar</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Modificar(ByVal prodModificado As Producto, ByVal NombreProdAntiguo As String) As String
        Dim men As String = ModificarEnLista(prodModificado, NombreProdAntiguo)
        If men = "" Then Grabar()
        Return men
    End Function
End Class
